package com.example.demo.java8;

import java.util.Comparator;
import java.util.function.Consumer;
import java.util.stream.IntStream;

/**
 * @ClassName LambdaTest
 * @Description TODO
 * @Author hly
 * @Date 2018\11\28 0028 14:52
 */
public class LambdaTest {
    /**
     * 一、Lambda表达式
     Lambda 表达式的基础语法：Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符 箭头操作符将 Lambda
     表达式拆分成两部分：

     左侧：Lambda 表达式的参数列表
     右侧：Lambda 表达式中所需执行的功能， 即 Lambda 体

     Lambda 表达式语法：

     语法格式一：无参数，无返回值 () -> System.out.println(“Hello Lambda!”);

     语法格式二：有一个参数，并且无返回值 (x) -> System.out.println(x)

     语法格式三：若只有一个参数，小括号可以省略不写 x -> System.out.println(x)

     语法格式四：有两个以上的参数，有返回值，并且 Lambda 体中有多条语句 Comparator com = (x, y) -> {
     System.out.println(“函数式接口”); return Integer.compare(x, y); };
     语法格式五：若 Lambda 体中只有一条语句， return 和 大括号都可以省略不写 Comparator com = (x, y)
     -> Integer.compare(x, y);

     语法格式六：Lambda 表达式的参数列表的数据类型可以省略不写，因为JVM编译器通过上下文推断出，数据类型，即“类型推断” (Integer x, Integer y) -> Integer.compare(x, y);
     关于类型推断：
     在 Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型，程序依然可以编译，这是因为 javac 根据程序的上下文，在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境，是由编译器推断出来的。这就是所谓的“类型推断”
     ---------------------
     二、 Lambda 表达式需要“函数式接口”的支持 函数式接口：接口中只有一个抽象方法的接口，称为函数式接口。
     可以使用注解 @FunctionalInterface 修饰 可以检查是否是函数式接口

     */

    //法格式一：无参数，无返回值
    public void test01() {
        Runnable rb = () -> System.out.println("hello lambda");
        rb.run();
    }
    //语法格式二：有一个参数，并且无返回值
    public void test02() {
        Consumer<String> cm = (e) -> System.out.println(e);
        cm.accept("hello world");
    }

    //语法格式三：若只有一个参数，小括号可以省略不写
    public void test03() {
        Consumer<String> cm = e -> System.out.println(e);
        cm.accept("hello world");
    }

    //语法格式四：有两个以上的参数，有返回值，并且 Lambda 体中有多条语句
    public void test04() {
        Comparator<Integer> cp = (x, y) -> {
            // 模拟多条语句
            System.out.println("hello world");
            return Integer.compare(x, y);
        };
    }

    // 语法格式五：若 Lambda 体中只有一条语句， return 和 大括号都可以省略不写
    public void test05() {
        Comparator<Integer> cp = (x, y) -> Integer.compare(x, y);
    }


    public void test06() {
        IntStream.range(0,10).forEach(System.out::println);
    }

    public static void main(String[] args) {
        LambdaTest test = new LambdaTest();
//        test.test01();
//        test.test02();
//        test.test03();
//        test.test04();
        test.test06();
    }
}
